package Day009_Map_斗地主_冒泡排序.demo07_斗地主;

/*
    按照斗地主的规则，完成洗牌发牌的动作。
    具体规则：
    1. 组装54张扑克牌
    2. 54张牌顺序打乱
    3. 三个玩家参与游戏，三人交替摸牌，每人17张牌，最后三张留作底牌。
    4. 查看三人各自手中的牌（按照牌的大小排序）、底牌
    规则：手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

 思路:
    造牌:
    1.创建Map集合对象,限制键的类型为Integer(编号),值的类型为String(牌面)
    2.添加54张牌
        创建List集合,表示四种花色
        创建List集合,表示牌面2~A
    3.定义int,表示编号,初始值为0
    4.往Map集合中添加大王,编号为0,添加完后编号自增1
    5.往Map集合中添加小王,编号为1,添加完后编号自增1
    6.循环嵌套,组合牌面和花色 (牌面作为外层循环)
    7.在循环中,编号作为键,牌面作为值存储到map集合中,每存储一张,编号自增1

    洗牌:
        1.获取所有牌的编号i(键),返回Set集合
        2.创建List集合,存储所有的牌编号
        3.Set集合中编号-->List集合中
        4.使用shuffle()方法,打乱List集合元素顺序

    发牌:(三人交替摸牌，每人17张牌，最后三张留作底牌)
        (索引0-53,索引%3==0给玩家一,==1给玩家二,==2给玩家三)

        1.创建4个List集合,存储玩家的牌和底牌的牌编号
        2.循环把打乱顺序的牌编号,按照索引一次发给玩家
        3.从大到小排序
        4.根据牌编号去map集合中获取牌

 */

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;

public class Test斗地主 {
    public static void main(String[] args) {
        //造牌

        //1.创建Map集合对象,限制键的类型为Integer(编号),值的类型为String(牌面)
        HashMap<Integer, String> map = new HashMap<>();

        //2.添加54张牌
        //创建List集合,表示四种花色
        ArrayList<String> colors = new ArrayList<>();
        Collections.addAll(colors, "♠", "♥", "♣", "♦");
        //创建List集合,表示牌面2~A
        ArrayList<String> numbers = new ArrayList<>();
        Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");

        //3.定义int,表示编号,初始值为0
        int i = 0;
        //4.往Map集合中添加大王,编号为0,添加完后编号自增1
        map.put(i++, "大王");
        //5.往Map集合中添加小王,编号为1,添加完后编号自增1
        map.put(i++, "小王");

        //6.循环嵌套,组合牌面和花色 (牌面作为外层循环)
        for (String number : numbers) {
            for (String color : colors) {
                String pai = color + number;
                //7.在循环中,编号作为键,牌面作为值存储到map集合中,每存储一张,编号自增1
                map.put(i++, pai);
            }
        }
        System.out.println(map);

//----------------------------------------------------------------------------------------------------------------------
        //洗牌
        //1.获取所有牌的编号i(键),返回Set集合
        Set<Integer> keySet = map.keySet();

        //2.创建List集合
        ArrayList<Integer> idlist = new ArrayList<>();

        //3.Set集合中编号-->List集合中
        idlist.addAll(keySet);

        //4.使用shuffle()方法,打乱List集合元素顺序
        Collections.shuffle(idlist);
        System.out.println("打乱顺序的牌编号:" + idlist);

//----------------------------------------------------------------------------------------------------------------------
        //发牌
        //1.创建4个List集合,存储玩家的牌和底牌的牌编号
        ArrayList<Integer> play1Id = new ArrayList<>();
        ArrayList<Integer> play2Id = new ArrayList<>();
        ArrayList<Integer> play3Id = new ArrayList<>();
        ArrayList<Integer> dipaiId = new ArrayList<>();
        //2.循环,把打乱顺序的牌编号,按照索引一次发给玩家
        for (int i1 = 0; i1 < idlist.size(); i1++) {
            Integer paiId = idlist.get(i1);
            if (i1 >= 51){
                dipaiId.add(paiId);
            } else if (i1%3 ==0){
                play1Id.add(paiId);
            } else if (i1%3 ==1){
                play2Id.add(paiId);
            } else if (i1%3 ==2){
                play3Id.add(paiId);
            }
        }
        //3.从大到小排序
        Collections.sort(play1Id);
        Collections.sort(play2Id);
        Collections.sort(play3Id);
        Collections.sort(dipaiId);
        //4.根据牌编号去map集合中获取牌
        System.out.print("石破天: ");
        for (Integer paiId : play1Id) {
            String pai = map.get(paiId);
            System.out.print(pai + " ");
        }
        System.out.println();
        System.out.print("张无忌: ");
        for (Integer paiId : play2Id) {
            String pai = map.get(paiId);
            System.out.print(pai + " ");
        }
        System.out.println();
        System.out.print("令狐冲: ");
        for (Integer paiId : play3Id) {
            String pai = map.get(paiId);
            System.out.print(pai + " ");
        }
        System.out.println();
        System.out.print("底牌: ");
        for (Integer paiId : dipaiId) {
            String pai = map.get(paiId);
            System.out.print(pai + " ");
        }
    }
}
